/*
 * XMLElement.h
 *
 *  Created on: 2010-3-24
 *      Author: wenjian
 */

#ifndef XMLELEMENT_H_
#define XMLELEMENT_H_
#include <vector>
#include "XMLAttribute.h"

using namespace std;

namespace Try {
  /** 声明文档类型 */
  class XMLDocument;
  /**
   * 描述XML元素
   */
  class XMLElement {
    public:
      XMLElement(XMLDocument* doc, const char* n);
      virtual ~XMLElement();

      /**
       * 检查是否是根元素
       */
      virtual bool isRootElement() const;

      /**
       * 返回元素名称
       */
      virtual const char* getName() const;

      /**
       * 设置元素名称, 复制元素名
       */
      virtual void setName(const char* name);

      /**
       * 返回元素文本值
       */
      virtual const char* getText() const;

      /**
       * 设置元素文本值, 复制文本值
       */
      virtual XMLElement* setText(const char* text);

      /**
       * 返回所有子元素列表
       */
      virtual const std::vector<XMLElement*>* getChildren() const;

      /**
       * 根据元素名称在参数vector中返回子元素列表
       */
      virtual std::vector<XMLElement*>* getChildren(const char* name, std::vector<XMLElement*>* v) const;

      /**
       * 返回第一个名称为name的子元素
       */
      virtual XMLElement* getChild(const char* name) const;

      /**
       * 向元素追加一个子元素, 返回this
       */
      virtual XMLElement* addChild(XMLElement* child);

      /**
       * 在子元素列表的指定位置插入一个子元素, 返回this
       */
      virtual XMLElement* addChild(int index, XMLElement* child);

      /**
       * 移除名称为name的第一个子元素, 如果移除失败，返回false, 比如此元素不存在
       */
      virtual bool removeChild(const char* name);

      /**
       * 移除子元素, 如果移除失败，返回false, 比如此元素不存在
       */
      virtual bool removeChild(const XMLElement* e);

      /**
       * 移除名称为name的所有（只操作下一层）子元素, 如果没有任何一个元素被移除，返回false
       */
      virtual bool removeChildren(const char* name);

      /**
       * 移除所有（只操作下一层）子元素, 如果没有任何一个元素被移除，返回false
       */
      virtual bool removeChildren();

      /**
       * 返回元素属性
       */
      virtual XMLAttribute* getAttribute(const char* name)const;

      /**
       * 返回所有属性
       */
      virtual const std::vector<XMLAttribute*>* getAttributes()const;

      /**
       * 根据属性名返回属性值
       */
      virtual const char* getAttributeValue(const char* name)const;

      /**
       * 设置属性
       */
      virtual XMLElement* setAttribute(XMLAttribute* a);

      /**
       * 设置属性
       */
      virtual XMLElement* setAttribute(const char* name, const char* value);

      /**
       * 返回父节点，如果不存在，返回NULL
       */
      virtual XMLElement* getParent();

      /**
       * 从父节点分离
       */
      virtual XMLElement* detach();

    protected:
      /** 文档 */
      XMLDocument* xmldoc;

      /** 父节点, 默认为NULL */
      XMLElement* parent;

      /** 所有子节点 */
      std::vector<XMLElement*> children;

      /** 所有属性 */
      std::vector<XMLAttribute*> attrs;

      /** 节点名 */
      char* name;

      /** 节点值 */
      char* text;


  };

}

#endif /* XMLELEMENT_H_ */
